---
title: "4. Execute your first query"
---

To execute your first query, you need to create an instance of `ApolloClient` and make a new call with your query.

## Create an ApolloClient

Create a new file named Apollo.kt in the `com.example.rocketreserver` package and create an instance of `ApolloClient` in it:

```kotlin title="app/src/main/java/com/example/rocketreserver/Apollo.kt"
import com.apollographql.apollo.ApolloClient

val apolloClient = ApolloClient.Builder()
    .serverUrl("https://apollo-fullstack-tutorial.herokuapp.com/graphql")
    .build()
```

> **Note**: `apolloClient` is a top-level variable so that it can be reused from other parts of the app later on for better performance. Reusing the `apolloClient` allows to reuse the underlying OkHttp instance and the associated threadpools and connections. In a real app, you would probably want to use a [dependency injection framework](https://developer.android.com/training/dependency-injection) to share the ApolloClient.

Creating the ApolloClient is as simple as giving it the endpoint of your GraphQL backend. It is `https://apollo-fullstack-tutorial.herokuapp.com/graphql` in our case.

## Execute the query

Open `LaunchList.kt` and update the contents of the `LaunchList` composable function. Use the apolloClient and the generated `LaunchListQuery` to execute a new query:

```kotlin title="app/src/main/java/com/example/rocketreserver/LaunchList.kt"
@Composable
fun LaunchList(onLaunchClick: (launchId: String) -> Unit) {
  LaunchedEffect(Unit) {
    val response = apolloClient.query(LaunchListQuery()).execute()
    Log.d("LaunchList", "Success ${response.data}")
  }
```

Thanks to [Kotlin coroutines](https://kotlinlang.org/docs/coroutines-overview.html), the query will be executed in a background thread even if the code looks synchronous.

> **Note**: for simplicity, we are executing the query in a `LaunchedEffect` block. In a real app, you may want to do this in a [ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel) and otherwise use a [layered architecture](https://developer.android.com/topic/architecture/recommendations#layered-architecture).

## Test your query

Hit run. You should see this in the logcat output:

```text title="(logcat)"
2023-03-14 12:08:30.694 16611-16611/com.example.rocketreserver
D/LaunchList: Success Data(launches=Launches(launches=[Launch(
id=109, site=CCAFS SLC 40), Launch(id=108, site=VAFB SLC 4E), 
Launch(id=107, site=KSC LC 39A), Launch(id=106, site=CCAFS SLC
40), Launch(id=105, site=CCAFS SLC 40), Launch(id=104, site=
KSC LC 39A), Launch(id=103, site=KSC LC 39A), Launch(id=102, 
site=KSC LC 39A), Launch(id=101, site=CCAFS SLC 40), Launch(
id=100, site=CCAFS SLC 40), Launch(id=99, site=KSC LC 39A), 
Launch(id=98, site=CCAFS SLC 40), Launch(id=97, site=CCAFS SLC 
40), Launch(id=96, site=CCAFS SLC 40), Launch(id=95, site=
CCAFS SLC 40), Launch(id=94, site=KSC LC 39A), Launch(id=93, 
site=KSC LC 39A), Launch(id=92, site=KSC LC 39A), Launch(id=91
, site=CCAFS SLC 40), Launch(id=90, site=CCAFS SLC 40)]))
```

This means the request was correctly executed and you now have a list of launch sites 🚀🚀🚀.

Next, let's [connect this data to your UI](05-connect-queries-to-your-ui).
